class Animal:
    def __init__(self):
        print("父类中的构造方法")

    def eat(self):
        print("吃")


class Dog(Animal):
    def __init__(self):
        super().__init__()  # 父类中的构造方法必须明确调用才行
        Animal.__init__(self)  # 等价于上面的写法，建议使用上面的
        print("子类中的构造方法")

    def sleep(self):
        # Dog.sleep(self) # 这里会变成递归，变成死循环，为什么可以这么调用？sleep既不是类方法，又不是实例方法
        print("睡")


dog = Dog()
dog.sleep()

print("-" * 200)
class Cat:
    def __init__(self):
        print("猫的构造方法")

    def eat(self):
        print("猫吃猫粮")

dog = Dog()
dog.sleep()
Cat.eat(dog) # 这里传入的self不正确，为什么也可以被调用
